}
#endif
+static gboolean
+jpeg_segment_fits_input (const GstJpegSegment * seg, gsize size)
+{
+ if (seg->size < 0)
+ return FALSE;
+
+ if ((gsize) seg->offset > size)
+ return FALSE;
+
+ return (gsize) seg->size <= size - (gsize) seg->offset;
+}
+
static GstFlowReturn
gst_jpeg_decoder_handle_frame (GstVideoDecoder * decoder,
GstVideoCodecFrame * frame)
if (!gst_jpeg_parse (&seg, map.data, map.size, offset))
goto unmap_and_error;
+ if (!jpeg_segment_fits_input (&seg, map.size))
+ goto unmap_and_error;
+
offset = seg.offset + seg.size;
marker = seg.marker;
if (!gst_jpeg_parse (&seg_scan, map.data, map.size, offset))
goto unmap_and_error;
+ if (!jpeg_segment_fits_input (&seg_scan, map.size))
+ goto unmap_and_error;
+
if (seg_scan.marker < GST_JPEG_MARKER_RST_MIN
|| seg_scan.marker > GST_JPEG_MARKER_RST_MAX)
break;